#pragma once
// 用类来封装Thread
#include <iostream>
#include <string>
#include <functional>
#include <pthread.h>
#include <assert.h>

// class Thread;//声明

// 上下文，当成一个大号的结构体
//  class Context
//  {
//  public:
//      Thread* _this;
//      void* _args;
//  public:
//      Context()
//          :_this(nullptr)
//          ,_args(nullptr)
//      {}
//      ~Context()
//      {}
//  };

namespace ThreadNs
{
    typedef std::function<void *(void *)> func_t;
    const int num = 1024;

    class Thread
    {
    private:

        static void *start_routine(void *args)
        {
            // Context* ctx = static_cast<Context *>(args);
            Thread *_this = static_cast<Thread *>(args);
            // void* ret = ctx->_this->run(ctx->_args);
            // delete[] ctx;
            return _this->run(_this->_args);
        }

        // run
        void *run(void *args)
        {
            return _func(args);
        }

    public:
        // 线程属性（信息）的初始化（类的构造函数）+ 创建线程
        Thread()
        {
            char namebuffer[num];
            snprintf(namebuffer, sizeof namebuffer, "thread-%d", threadnum++);
            _name = namebuffer;

            // 创建线程
            //  Context* ctx = new Context();
            //  ctx->_this = this;
            //  ctx->_args = _args;
        }

        // 传递C接口函数
        //  void* start_routine(void*args)//类中有隐含的this指针，不符合pthread_create函数说要求的函数参数（void*func（void* name））
        //  {
        //      return _func(args);
        //  }

        void start(func_t func, void *args = nullptr)
        {
            _func = func;
            _args = args;
            int n = pthread_create(&_tid, nullptr, start_routine, this); //_func是C++特有的，而pthread_create是C得接口，所以这里不能使用_func
            assert(n == 0);
            (void)n;
        }

        // 等待线程
        void join()
        {
            int n = pthread_join(_tid, nullptr);
            assert(0 == n);
            (void)n;
        }

        std::string threadname()
        {
            return _name;
        }


        ~Thread()
        {
        }

    private:
        std::string _name;//给线程起的名字
        func_t _func;//pthead_create中的函数
        void *_args;//pthead_create中的args
        pthread_t _tid;//线程的tid

        static int threadnum;//线程的编号
    };
    int Thread::threadnum = 1;
}